#ifndef MAPBASE_H
#define MAPBASE_H


// 方块枚举
namespace Blocks{
    enum value{end=-2,start=-1,floor=0,wall=1,grass=2,lava=3};
}

namespace States{
    enum class search{searching,stopped};
}

// 坐标类
template<typename T>
struct Coord {
    T x;
    T y;
    Coord() {x=0;y=0;}
    Coord(T x, T y) : x(x), y(y) {}
    bool operator==(const Coord<T>& coord) const {
        return x == coord.x && y == coord.y;
    }
    bool operator!=(const Coord<T>& coord) {
        return coord.x != x || coord.y != y;
    }
    Coord<T>& operator+=(const Coord<T>& coord) {
        x += coord.x;
        y += coord.y;
        return *this;
    }
    Coord<T>& operator-=(const Coord<T>& coord) {
        x -= coord.x;
        y -= coord.y;
        return *this;
    }
    bool operator<(const Coord<T>& coord) const {
        if (x != coord.x) {
            return x < coord.x;
        }
        return y < coord.y;
    }
    Coord<T> operator+(const Coord<T>& coord) const {
        return Coord<T>{x + coord.x, y + coord.y};
    }
    Coord<T> operator-(const Coord<T>& coord) const {
        return Coord<T>{x - coord.x, y - coord.y};
    }
    Coord<T> operator*(const Coord<T>& coord) const {
        return Coord<T>{x* coord.x, y* coord.y};
    }
#ifdef _MSC_VER
    static const Coord<T> zero;
};
template<typename T>
const Coord<T> Coord<T>::zero = Coord<T>{ 0, 0 };
#else
    static inline const Coord<T> zero{0,0};
};
#endif

namespace std {
    template<typename T>
    struct hash<Coord<T>> {
        std::size_t operator()(const Coord<T>& coord) const noexcept {
            std::size_t h1 = std::hash<T>{}(coord.x);
            std::size_t h2 = std::hash<T>{}(coord.y);
            return h1 ^ (h2 << 1);
        }
    };
}

#endif